﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

using System.Web;
using ComunesMGI.DataTypes;
using ComunesMGI.Enums;
using ComunesMGI.Constantes;

using MGI.AccesoDatos.AccesoSP;

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using ComunesMGI.Condiciones;
using ComunesMGI.Excepciones;



namespace SharepointWS
{
    public class CtrSharepoint : ISharepoint
    {

        #region ISharepoint Members


        public string TraducirCampo(string sitio, Lista lista, string campo, string valorCampo)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            string temp = SPAcceso.LeerCampoChoiceIdioma(lista, campo, valorCampo, myWeb.Language);
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return temp;
        }

        private SPUser ObtenerUsuario(SPWeb myWeb, string nombreUsuario)
        {
            foreach (SPUser usuario in myWeb.AllUsers)
            {
                if (usuario.Name == nombreUsuario)
                    return usuario;
            }
            throw new Exception("No existe login para el usuario " + nombreUsuario);
        }


        public DataEliminarTarea EliminarTarea(string sitio, int idTarea)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            SPListItem item = spLista.GetItemById(idTarea);
            DataEliminarTarea tarea = null;

            if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language)] != null)
            {

                string nomUsuario = (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language)]).ToString();
                nomUsuario = nomUsuario.Substring(nomUsuario.LastIndexOf("#") + 1);
                //SPUser usuario = myWeb.AllUsers[nomUsuario];
                SPUser usuario = ObtenerUsuario(myWeb, nomUsuario);
                string titulo = "";
                string descripcion = "";
                string mail = usuario.Email;
                if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)] != null)
                {
                    titulo = item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString();
                }
                if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)] != null)
                {
                    descripcion = item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)].ToString();
                }
                tarea = new DataEliminarTarea(true, mail, idTarea, titulo, descripcion);

            }
            else
            {
                tarea = new DataEliminarTarea(false, "", idTarea, "", "");
            }

            SPAcceso.EliminarItem(myWeb, idTarea, Lista.Tareas);
            SPAcceso.Desconectar(ref mySite, ref myWeb);

            return tarea;
        }

        public void EliminarIncidente(string sitio, int idIncidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.EliminarItem(myWeb, idIncidente, Lista.Incidentes);
            SPAcceso.Desconectar(ref mySite, ref myWeb);

        }


        public List<DataSincronizarTarea> GetTareasAsignadasDespuesFecha(string sitio, DateTime fechaSincronizacion, string nombreUsuario)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            List<DataSincronizarTarea> tareas = new List<DataSincronizarTarea>();

            SPUser spUser = myWeb.AllUsers[nombreUsuario];
            string nomUsuarioLargo = spUser.Name;

            string campoFechaCreacion = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Creado", myWeb.Language).ToString()].InternalName.ToString();
            string campoFechaModificado = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Modificado", myWeb.Language).ToString()].InternalName.ToString();
            string campoAsignadoA = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language).ToString()].InternalName.ToString();


            string asignadasAUsuario = "<Eq>" +
                                    "<FieldRef Name='" +
                                        campoAsignadoA +
                                    "'/>" +
                                    "<Value Type='Text'>" +
                                        nomUsuarioLargo +
                                    "</Value>" +
                                "</Eq>";

            string creadaDespues = "<Gt>" +
                                    "<FieldRef Name='" +
                                        campoFechaCreacion +
                                    "'/>" +
                                    "<Value Type='DateTime' IncludeTimeValue='TRUE'>" +
                                        fechaSincronizacion.ToString("s") +
                                    "</Value>" +
                                "</Gt>";

            string modificadaDespues = "<Gt>" +
                                    "<FieldRef Name='" +
                                        campoFechaModificado +
                                    "'/>" +
                                    "<Value Type='DateTime' IncludeTimeValue='TRUE'>" +
                                        fechaSincronizacion.ToString("s") +
                                    "</Value>" +
                                "</Gt>";

            string creadaAntes = "<Leq>" +
                                    "<FieldRef Name='" +
                                        campoFechaCreacion +
                                    "'/>" +
                                    "<Value Type='DateTime' IncludeTimeValue='TRUE'>" +
                                        fechaSincronizacion.ToString("s") +
                                    "</Value>" +
                                "</Leq>";


            SPQuery queryCreada = new SPQuery();
            queryCreada.Query = "<Where>" +
                                    "<And>" +
                                        asignadasAUsuario +
                                        creadaDespues +
                                    "</And>" +
                               "</Where>";

            SPQuery queryModificada = new SPQuery();
            queryModificada.Query = "<Where>" +
                                        "<And>" +
                                            "<And>" +
                                                modificadaDespues +
                                                creadaAntes +
                                            "</And>" +
                                            asignadasAUsuario +
                                        "</And>" +
                                    "</Where>";

            foreach (SPListItem spItem in spLista.GetItems(queryCreada))
            {

                int idTarea = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "ID", myWeb.Language)].ToString());
                string titulo = null;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)] != null)
                {
                    titulo = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString();
                }
                string descripcion = null;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)] != null)
                {
                    descripcion = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)].ToString();
                }
                DateTime comienzo = ConstantesMGI.FechaVacia;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de comienzo", myWeb.Language)] != null)
                {
                    comienzo = DateTime.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de comienzo", myWeb.Language)].ToString());
                }
                DateTime vencimiento = ConstantesMGI.FechaVacia;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de vencimiento", myWeb.Language)] != null)
                {
                    vencimiento = DateTime.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de vencimiento", myWeb.Language)].ToString());
                }
                int completado = 0;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "% completado", myWeb.Language)] != null)
                {
                    float completadoFloat = float.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "% completado", myWeb.Language)].ToString());
                    completado = (int)completadoFloat * 100;
                }


                DataSincronizarTarea dataTarea = new DataSincronizarTarea(idTarea, EstadoSincronizacion.Alta, titulo, descripcion, comienzo, vencimiento, completado);
                tareas.Add(dataTarea);
            }

            foreach (SPListItem spItem in spLista.GetItems(queryModificada))
            {

                int idTarea = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "ID", myWeb.Language)].ToString());
                string titulo = null;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)] != null)
                {
                    titulo = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString();
                }
                string descripcion = null;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)] != null)
                {
                    descripcion = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)].ToString();
                }
                DateTime comienzo = ConstantesMGI.FechaVacia;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de comienzo", myWeb.Language)] != null)
                {
                    comienzo = DateTime.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de comienzo", myWeb.Language)].ToString());
                }
                DateTime vencimiento = ConstantesMGI.FechaVacia;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de vencimiento", myWeb.Language)] != null)
                {
                    vencimiento = DateTime.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha de vencimiento", myWeb.Language)].ToString());
                }
                int completado = 0;
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "% completado", myWeb.Language)] != null)
                {
                    float completadoFloat = float.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "% completado", myWeb.Language)].ToString());
                    completado = (int)completadoFloat * 100;
                }

                DataSincronizarTarea dataTarea = new DataSincronizarTarea(idTarea, EstadoSincronizacion.Modificación, titulo, descripcion, comienzo, vencimiento, completado);
                tareas.Add(dataTarea);
            }

            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return tareas;
        }


        public void DesasociarIncidentesWP(string sitio, List<int> incidentes)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            SPListItem item = null;
            foreach (int idIncidente in incidentes)
            {
                item = spLista.GetItemById(idIncidente);
                if (item != null)
                {
                    item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] = null;
                    item.Update();
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }



        /*        public void ModificarIncidente(string sitio, string idIncidente, List<DataCampo> datos)
                {
                    SPSite mySite = null;
                    SPWeb myWeb = null;
                    SPList spLista = null;
                    SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);


                    SPQuery query = new SPQuery();

                    //(not estado==cerrado) and (isnull(wp))
                    query.Query = "<Where>" +
                                     "<Eq>" + //1 and 2
                                        "<FieldRef Name='" +
                                            SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language) +
                                        "' />" +
                                        "<Value Type='Number'>" +
                                            idIncidente +
                                        "</Value>" +
                                     "</Eq>" +
                                  "</Where>";

                    //No se pudo agregar una comparación entre dos campos de un mismo item
                    //en CAML por lo tanto se hace el filtrado de los repetidos (idIncidente == idIssue) 
                    //luego que fue obtenido un subgrupo de items por medio del query
                    foreach (SPListItem item in spLista.GetItems(query))
                    {
                        if (item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)] != null && item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)] != null)
                        {
                            foreach (DataCampo campo in datos)
                            {
                                item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, campo.Titulo, myWeb.Language)] = SPAcceso.ConvertirValorCampo(campo.Tipo, campo.Valor, myWeb);
                            }
                        }
                    }
                    SPAcceso.Desconectar(ref mySite, ref myWeb);
                }
        */

        /// <summary>
        /// Dado los títulos de los campos y otra información traida del xml 
        /// de configuración, se retorna una lista con información mas completa 
        /// (incluyendo la anterior) acerca de los campos, traida del sitio 
        /// sharepoint .
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="sistema"></param>
        /// <param name="tipoLista"></param>
        /// <param name="nomCampos"></param>
        /// <returns>List<DataCampo></returns>
        public List<DataCampo> GetCampos(string sitioSistema, Lista tipoLista, List<DataCampo> nomCampos)
        {


            SPSite mySite = null;
            SPWeb myWeb = null;
            SPAcceso.Conectar(sitioSistema, ref mySite, ref myWeb);
            SPList spLista;
            try
            {

                switch (tipoLista)
                {
                    case Lista.Incidentes:
                        spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(Lista.Incidentes, myWeb.Language)];
                        break;
                    case Lista.Tareas:
                        spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(Lista.Tareas, myWeb.Language)];
                        break;
                    default:
                        spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(Lista.Incidentes, myWeb.Language)];
                        break;
                }
            }
            catch
            {
                throw new Exception("La lista no se encuentra. Verifique que exista el sitio en SharePoint.");

            }
            List<DataCampo> campos = new List<DataCampo>();
            foreach (DataCampo dataCampo in nomCampos)
            {
                SPField spField = null;
                try
                {
                    spField = spLista.Fields[SPAcceso.LeerCampoIdioma(tipoLista, dataCampo.Titulo, myWeb.Language)];
                }
                catch
                {
                    throw new Exception("El nombre del campo " + SPAcceso.LeerCampoIdioma(tipoLista, dataCampo.Titulo, myWeb.Language) + " del xml no existe en Sharepoint");
                }
                CampoSharepoint tipoCampo = SpTypeToCampoSharepoint(spField.TypeAsString);
                string tituloCampo = spField.Title;
                bool requeridoCampo = spField.Required;
                string defaultCampo = spField.DefaultValue;

                DataCampo dataCampo2 = new DataCampo(tipoCampo, tituloCampo, defaultCampo, requeridoCampo, null);
                dataCampo2.ParteMail = dataCampo.ParteMail;

                switch (tipoCampo)
                {
                    case CampoSharepoint.Choice:
                        List<string> cadaChoice = new List<string>();
                        foreach (string choice in ((SPFieldChoice)spField).Choices)
                        {
                            cadaChoice.Add(choice);
                        }
                        dataCampo2.Opciones = cadaChoice;
                        break;
                    default:
                        break;
                }
                campos.Add(dataCampo2);
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return campos;

        }





        /// <summary>
        /// Alta de incidente en sharepoint
        /// </summary>
        /// <param name="sistema"></param>
        public DataAltaIncidente AddIncidente(DataSistema sistema)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //          SPAcceso.Conectar(sistema.Sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sistema.Sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

            ControlarFechasIncidente(myWeb, sistema.Campos);


            string[] stringTemporal = SPAcceso.Impactar(myWeb, spLista, sistema.Campos, Lista.Incidentes);
            DataAltaIncidente altaIncidente = new DataAltaIncidente(System.Convert.ToInt32(stringTemporal[0]), stringTemporal[1]);
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return altaIncidente;
        }

        /// <summary>
        /// Controla que la fecha de propuesto no se mayor a la fehca de cierre
        /// Se asume que mySite y myWeb ya estan conectadas al sitio.
        /// </summary>
        /// <param name="mySite"></param>
        /// <param name="myWeb"></param>
        /// <param name="sistema"></param>
        private void ControlarFechasIncidente(SPWeb myWeb, List<DataCampo> campos)
        {
            DataCampo campoFechaCierre = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language));
            DataCampo campoFechaPropuesto = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language));
            if (!string.IsNullOrEmpty(campoFechaCierre.Valor))
            {
                DateTime fechaCierre = DateTime.ParseExact(campoFechaCierre.Valor, ConstantesMGI.FormatoFechas, null);
                if (!string.IsNullOrEmpty(campoFechaPropuesto.Valor))
                {
                    DateTime fechaPropuesto = DateTime.ParseExact(campoFechaPropuesto.Valor, ConstantesMGI.FormatoFechas, null);
                    if (!fechaCierre.Equals(ConstantesMGI.FechaVacia) && !fechaPropuesto.Equals(ConstantesMGI.FechaVacia))
                    {
                        if (fechaPropuesto.CompareTo(fechaCierre) > 0)
                        {
                            throw new Exception("La fecha de propuesta no puede ser mayor que la fecha de cierre");
                        }
                    }
                }
                else
                {
                    DateTime fechaPropuesto = DateTime.Now;
                    if (fechaPropuesto.CompareTo(fechaCierre) > 0)
                    {
                        throw new Exception("La fecha de propuesta no puede ser mayor que la fecha de cierre");
                    }

                }
            }

        }

        /// <summary>
        /// Controla que la fecha de comienzo no se mayor a la fehca de vencimiento ni a la fecha estimada 
        /// de fin
        /// Se asume que mySite y myWeb ya estan conectadas al sitio.
        /// </summary>
        /// <param name="mySite"></param>
        /// <param name="myWeb"></param>
        /// <param name="sistema"></param>
        private void ControlarFechasTareas(SPWeb myWeb, List<DataCampo> campos)
        {
            DataCampo campoFechaComienzo = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha de comienzo", myWeb.Language));
            DataCampo campoFechaVencimiento = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha de vencimiento", myWeb.Language));
            DataCampo campoFechaEstimadaFin = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Estimada Fin", myWeb.Language));
            DataCampo campoFechaCierre = campos.Find(dataCampo => dataCampo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language));
            if (!string.IsNullOrEmpty(campoFechaVencimiento.Valor))
            {
                DateTime fechaVencimiento = DateTime.ParseExact(campoFechaVencimiento.Valor, ConstantesMGI.FormatoFechas, null);
                if (!string.IsNullOrEmpty(campoFechaComienzo.Valor))
                {
                    DateTime fechaComienzo = DateTime.ParseExact(campoFechaComienzo.Valor, ConstantesMGI.FormatoFechas, null);
                    if (!fechaComienzo.Equals(ConstantesMGI.FechaVacia) && !fechaVencimiento.Equals(ConstantesMGI.FechaVacia))
                    {
                        if (fechaComienzo.CompareTo(fechaVencimiento) > 0)
                        {
                            throw new Exception("La fecha de comienzo no puede ser mayor que la fecha de vencimiento");
                        }
                    }
                }
                else
                {
                    DateTime fechaComienzo = DateTime.Now;
                    if (fechaComienzo.CompareTo(fechaVencimiento) > 0)
                    {
                        throw new Exception("La fecha de comienzo no puede ser mayor que la fecha de vencimiento");
                    }

                }
            }


            //Control para la fecha estimada de fin
            if (!string.IsNullOrEmpty(campoFechaEstimadaFin.Valor))
            {
                DateTime fechaEstimadaFin = DateTime.ParseExact(campoFechaEstimadaFin.Valor, ConstantesMGI.FormatoFechas, null);
                if (!string.IsNullOrEmpty(campoFechaComienzo.Valor))
                {
                    DateTime fechaComienzo = DateTime.ParseExact(campoFechaComienzo.Valor, ConstantesMGI.FormatoFechas, null);
                    if (!fechaComienzo.Equals(ConstantesMGI.FechaVacia) && !fechaEstimadaFin.Equals(ConstantesMGI.FechaVacia))
                    {
                        if (fechaComienzo.CompareTo(fechaEstimadaFin) > 0)
                        {
                            throw new Exception("La fecha de comienzo no puede ser mayor que la fecha estimada de fin");
                        }
                    }
                }
                else
                {
                    DateTime fechaComienzo = DateTime.Now;
                    if (fechaComienzo.CompareTo(fechaEstimadaFin) > 0)
                    {
                        throw new Exception("La fecha de comienzo no puede ser mayor que la fecha estimada de fin");
                    }

                }
            }

            //Controlo la fecha de cierre no sea mayor que la fecha de
            if (!string.IsNullOrEmpty(campoFechaCierre.Valor))
            {
                DateTime fechaCierre = DateTime.ParseExact(campoFechaCierre.Valor, ConstantesMGI.FormatoFechas, null);
                if (!string.IsNullOrEmpty(campoFechaComienzo.Valor))
                {
                    DateTime fechaComienzo = DateTime.ParseExact(campoFechaComienzo.Valor, ConstantesMGI.FormatoFechas, null);
                    if (!fechaComienzo.Equals(ConstantesMGI.FechaVacia) && !fechaCierre.Equals(ConstantesMGI.FechaVacia))
                    {
                        if (fechaComienzo.CompareTo(fechaCierre) > 0)
                        {
                            throw new Exception("La fecha de comienzo no puede ser mayor que la fecha de cierre");
                        }
                    }
                }
                else
                {
                    DateTime fechaComienzo = DateTime.Now;
                    if (fechaComienzo.CompareTo(fechaCierre) > 0)
                    {
                        throw new Exception("La fecha de comienzo no puede ser mayor que la fecha de cierre");
                    }

                }
            }

        }




        public List<DataIncidente> GetIncidentes(string sitio, List<Condicion> condiciones)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //          SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidente> listaDataIncidente = new List<DataIncidente>();
            string tituloIncidente;
            int idIncidente;
            int idIssue;
            foreach (SPListItem spItem in spLista.Items)
            {
                idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());

                idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                {
                    tituloIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                }
                else
                {
                    tituloIncidente = "-no hay dato-";
                }

                //Si el id del incidente es igual al id antecesor 
                //(traducción inexacta) entonces
                //se trata del incidente inicial y no de una copia
                if (idIncidente == idIssue)
                {
                    bool cumple = true;
                    if (condiciones != null)
                    {
                        foreach (Condicion cond in condiciones)
                        {
                            string nomCampo = cond.GetNombreCampo();
                            string valor = "";
                            try
                            {

                                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, nomCampo, myWeb.Language)] != null)
                                {
                                    valor = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, nomCampo, myWeb.Language)].ToString();
                                }
                            }
                            catch (Exception)
                            {
                                throw new SPObjetoInexistenteException("No existe el campo " + nomCampo + " en Sharepoint");
                            }
                            try
                            {
                                if (!cond.Evaluar(valor))
                                {
                                    cumple = false;
                                    continue;
                                }

                            }
                            catch (Exception)
                            {
                                throw new Exception("Error al evaluar la condicion");
                            }

                        }
                    }
                    if (cumple)
                    {
                        DataIncidente dataIncidente = new DataIncidente(idIncidente, tituloIncidente);
                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }

        public DataIncidenteConCampos GetIncidente(int idIncidente, string sitio, List<DataCampo> campos)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            SPListItem item = spLista.Items.GetItemById(idIncidente);

            string descripcion = item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();

            DataIncidenteConCampos incidente = new DataIncidenteConCampos(idIncidente, descripcion, campos);

            foreach (DataCampo dataCampo in campos)
            {
                SPField spField = null;
                try
                {
                    spField = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, dataCampo.Titulo, myWeb.Language)];
                }
                catch
                {
                    throw new Exception("El nombre del campo " + SPAcceso.LeerCampoIdioma(Lista.Incidentes, dataCampo.Titulo, myWeb.Language) + " del xml no existe en Sharepoint");
                }
                dataCampo.Tipo = SpTypeToCampoSharepoint(spField.TypeAsString);
                dataCampo.Titulo = spField.Title;
                dataCampo.Requerido = spField.Required;

                if (item[dataCampo.Titulo] != null)
                {
                    switch (dataCampo.Tipo)
                    {
                        case CampoSharepoint.Choice:
                            List<string> cadaChoice = new List<string>();
                            foreach (string choice in ((SPFieldChoice)spField).Choices)
                            {
                                cadaChoice.Add(choice);
                            }
                            dataCampo.Opciones = cadaChoice;
                            dataCampo.Valor = item[dataCampo.Titulo].ToString();
                            break;

                        case CampoSharepoint.DateTime:
                            dataCampo.Valor = ((DateTime)item[dataCampo.Titulo]).ToString(ConstantesMGI.FormatoFechas);
                            break;

                        case CampoSharepoint.User:
                            System.Text.RegularExpressions.Regex rexLookupField = new System.Text.RegularExpressions.Regex(@"(\d+);#(.*)$", System.Text.RegularExpressions.RegexOptions.Compiled);
                            if (rexLookupField.Match(item[dataCampo.Titulo].ToString()).Success)
                            {
                                string nomUsuarioSH = rexLookupField.Match(item[dataCampo.Titulo].ToString()).Result("$2");
                                dataCampo.Valor = ObtenerUsuario(myWeb, nomUsuarioSH).LoginName;
                            }
                            else
                            {
                                throw new Exception("Problemas al obtener usuario en Sharepoint");
                            }
                            break;
                        default:
                            dataCampo.Valor = item[dataCampo.Titulo].ToString();
                            break;
                    }
                }
                else
                    dataCampo.Valor = "";
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return incidente;
        }

        public void ModificarIncidente(string sitio, DataIncidenteConCampos incidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            ControlarFechasIncidente(myWeb, incidente.Campos);

            SPListItem item = spLista.Items.GetItemById(incidente.IdIncidente);


            SPAcceso.ModificarItem(myWeb, incidente.Campos, Lista.Incidentes, item);

            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }


        public DataEliminarTarea ModificarTarea(string sitio, DataTareaConCampos tarea)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            bool tareaCerrada = ControlarCierreTarea(myWeb, tarea.Campos);
            ControlarFechasTareas(myWeb, tarea.Campos);
            SPListItem item = spLista.Items.GetItemById(System.Convert.ToInt32(tarea.IdTarea));
            SPAcceso.ModificarItem(myWeb, tarea.Campos, Lista.Tareas, item);
            item = spLista.Items.GetItemById(System.Convert.ToInt32(tarea.IdTarea));
            DataEliminarTarea dataModifTarea = null;

            if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language)] != null)
            {

                string nomUsuario = (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language)]).ToString();
                nomUsuario = nomUsuario.Substring(nomUsuario.LastIndexOf("#") + 1);
                //SPUser usuario = myWeb.AllUsers[nomUsuario];
                SPUser usuario = ObtenerUsuario(myWeb, nomUsuario);
                string titulo = "";
                string descripcion = "";
                string mail = usuario.Email;
                if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)] != null)
                {
                    titulo = item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString();
                }
                if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)] != null)
                {
                    descripcion = item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Descripción", myWeb.Language)].ToString();
                }
                dataModifTarea = new DataEliminarTarea(true, mail, System.Convert.ToInt32(tarea.IdTarea), titulo, descripcion);

            }
            else
            {
                dataModifTarea = new DataEliminarTarea(false, "", System.Convert.ToInt32(tarea.IdTarea), "", "");
            }

            //En el caso que la tarea fue cerrada, si todas la tareas asociadas al incidente
            //están cerradas y el incidente no tiene fecha de fin, se le asigna como fecha de fin
            //la mayor de las fechas de fin de las tareas
            if (tareaCerrada)
            {
                string idIncidente = item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString();
                if (TodasTareasIncidenteCerradas(sitio, idIncidente))
                {
                    DateTime fechaCierreIncidente = MaxFechaLista(myWeb, Lista.Tareas, idIncidente, SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language), SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha Cierre", myWeb.Language));
                    CerrarIncidente(sitio, idIncidente, fechaCierreIncidente);
                }
            }

            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return dataModifTarea;
        }

        /// <summary>
        /// PRECONDICION: Se asume que la fecha no es vacia ni null
        /// </summary>
        /// <param name="idIncidente"></param>
        /// <param name="fechaCierreIncidente"></param>
        private void CerrarIncidente(string sitio, string idIncidente, DateTime fechaCierreIncidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            SPListItem item = spLista.Items.GetItemById(int.Parse(idIncidente));
            if ((item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)] == null) || string.IsNullOrEmpty(item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)].ToString()))
            {
                item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)] = fechaCierreIncidente;
                item.Update();
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }

        private bool TodasTareasIncidenteCerradas(string sitio, string idIncidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            List<DataTarea> listaDataTarea = new List<DataTarea>();
            string strTemp = null;
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    strTemp = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString();
                    if (strTemp == idIncidente.ToString())
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Estado", myWeb.Language)] != null)
                        {
                            if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Estado", myWeb.Language)].ToString() != SPAcceso.LeerCampoIdioma(Lista.Tareas, "Cerrado", myWeb.Language))
                            {
                                SPAcceso.Desconectar(ref mySite, ref myWeb);
                                return false;
                            }

                        }
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return true;

        }

        /// <summary>
        /// Controla que si se cierra la tarea y no se asigna fecha de cierre se le asigna la fecha actual
        /// retorna true si se cerro la tarea y false si no
        /// </summary>
        /// <param name="myWeb"></param>
        /// <param name="campos"></param>
        private bool ControlarCierreTarea(SPWeb myWeb, List<DataCampo> campos)
        {
            DataCampo campoFechaCierre = campos.Find(dc => dc.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language).ToString());
            DataCampo campoEstado = campos.Find(dc => dc.Titulo == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language).ToString());
            if (!string.IsNullOrEmpty(campoEstado.Valor))
            {
                if (campoEstado.Valor == SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Cerrado", myWeb.Language).ToString())
                {
                    if (string.IsNullOrEmpty(campoFechaCierre.Valor))
                    {
                        campoFechaCierre.Valor = DateTime.Now.ToString(ConstantesMGI.FormatoFechas);
                    }
                    return true;
                }
            }
            return false;
        }



        public List<DataIncidente> GetIncidentesAsignablesWP(string sitioSistema, int wkpCod, DateTime fechaEstFinWP)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //SPAcceso.Conectar(sitioSistema, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitioSistema, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidente> listaDataIncidente = new List<DataIncidente>();

            int idIncidente;
            int idIssue;
            string tituloIncidente;

            //Obtengo nombres internos de los campos (requerido en spquery)
            string nameWP = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language).ToString()].InternalName.ToString();
            string nameEstado = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language).ToString()].InternalName.ToString();

            SPQuery query = new SPQuery();

            //(not estado==cerrado) and (isnull(wp))
            query.Query = "<Where>" +
                             "<And>" + //1 and 2
                               "<Neq>" + //1 no iguales item.Estado y Cerrado
                                    "<FieldRef Name='" +
                                        nameEstado +
                                    "' />" +
                                    "<Value Type='Choice'>" +
                                        SPAcceso.LeerCampoChoiceIdioma(Lista.Incidentes, "Estado", "Cerrado", myWeb.Language) + //aca deberá agregarse el manejo del choice multilenguaje
                                    "</Value>" +
                               "</Neq>" +
                               "<IsNull>" + //2 es nulo WP
                                    "<FieldRef Name='" +
                                         nameWP +
                                    "' />" +
                               "</IsNull>" +
                             "</And>" +
                          "</Where>";


            //No se pudo agregar una comparación entre dos campos de un mismo item
            //en CAML por lo tanto se hace el filtrado de los repetidos (idIncidente == idIssue) 
            //luego que fue obtenido un subgrupo de items por medio del query
            foreach (SPListItem item in spLista.GetItems(query))
            {
                if (item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                {
                    tituloIncidente = item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                }
                else
                {
                    tituloIncidente = "-no hay dato-";
                }

                idIncidente = int.Parse(item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                idIssue = int.Parse(item[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                if (idIncidente == idIssue)
                {

                    //filtramos los que cumplen que fecha estimada fin <= fecha estimada fin wp
                    if (!fechaEstFinWP.Equals(ConstantesMGI.FechaVacia))
                    {

                        DateTime fechaEstFinIncidente = this.DarFechaEstimadaFinIncidente(idIncidente, sitioSistema);
                        if (fechaEstFinIncidente.CompareTo(fechaEstFinWP) <= 0)
                        {
                            DataIncidente dataIncidente = new DataIncidente(item.ID, tituloIncidente);
                            listaDataIncidente.Add(dataIncidente);
                        }
                    }
                    else
                    {
                        DataIncidente dataIncidente = new DataIncidente(item.ID, tituloIncidente);
                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }

            /*
            spLista.GetItems();
            foreach (SPListItem spItem in spLista.Items)
            {
                idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                {
                    tituloIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                }
                else
                {
                    tituloIncidente = "-no hay dato-";
                }

                //Si el id del incidente es igual al id antecesor 
                //(traducción inexacta) entonces
                //se trata del incidente inicial y no de una copia
                if (idIncidente == idIssue)
                {
                    if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)].ToString() != "Cerrado" && spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] == null)
                    {
                        DataIncidente dataIncidente = new DataIncidente(idIncidente, tituloIncidente);
                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }
            */

            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }


        /// <summary>
        /// Calcula la fecha estimada de fin del incidente
        /// y si no tiene retorna la fecha vacía
        /// </summary>
        /// <param name="myWeb"></param>
        /// <param name="listaTareas"></param>
        /// <param name="idIncidente"></param>
        /// <param name="fechaEstFinWP"></param>
        /// <returns></returns>
        private DateTime DarFechaEstimadaFinIncidente(int idIncidente, string sitioSistema)
        {
            SPQuery query = new SPQuery();
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //SPAcceso.Conectar(sitioSistema, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitioSistema, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            string nameIdIncidente = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language).ToString()].InternalName.ToString();
            string nameFechaEstimadaFin = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha Estimada Fin", myWeb.Language).ToString()].InternalName.ToString();

            //Id original = IdIncidente AND fechaEstimadaFin != null
            query.Query = "<Where>" +
                             "<And>" +
                               "<Eq>" +
                                    "<FieldRef Name='" +
                                        nameIdIncidente +
                                    "' />" +
                                    "<Value Type='Number'>" +
                                        idIncidente.ToString() +
                                    "</Value>" +
                               "</Eq>" +
                               "<IsNotNull>" +
                                    "<FieldRef Name='" +
                                         nameFechaEstimadaFin +
                                    "' />" +
                               "</IsNotNull>" +
                             "</And>" +
                          "</Where>";

            DateTime fechaMaxima = ConstantesMGI.FechaVacia;

            foreach (SPListItem item in spLista.GetItems(query))
            {
                if (item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha Estimada Fin", myWeb.Language)] != null)
                {
                    DateTime fechaTarea = DateTime.Parse(item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Fecha Estimada Fin", myWeb.Language)].ToString());
                    if (fechaTarea.CompareTo(fechaMaxima) > 0)
                    {
                        fechaMaxima = fechaTarea;
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return fechaMaxima;

        }

        /// <summary>
        /// Retorna información de todos los incidentes en el sitio 
        /// del cliente-sistema
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="sistema"></param>
        /// <returns>List<DataIncidente></returns>
        public List<DataIncidenteReporte> GetIncidentesReporte(DataSistema sistema)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //         SPAcceso.Conectar(sistema.Sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sistema.Sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidenteReporte> listaDataIncidente = new List<DataIncidenteReporte>();
            string idIssue = null;
            string titulo = null;
            string url = null;
            string urlItem = null;
            string responsable = null;
            string nomSistema = null;
            string estado = null;
            string wp = null;
            string descripcion = null;
            string idIncidente = null;
            DateTime fechaPropuesto = ConstantesMGI.FechaVacia;
            DateTime fechaCierre = ConstantesMGI.FechaVacia;


            //uint idioma = myWeb.Language;
            //obtiene la parte final de la url conteniendo el nombre de la lista
            int ini = spLista.DefaultViewUrl.LastIndexOf(ConstantesMGI.PageDefaultUrlLista + "/");
            //elimina la vista por defecto porque no permite acceso directo a la url del item
            //en su lugar usamos DispForm.aspx
            int largo = spLista.DefaultViewUrl.LastIndexOf("/") - ini;
            string parteLista = spLista.DefaultViewUrl.Substring(ini, largo) + "/" + ConstantesMGI.PageDefaultUrlListaItems;
            url = sistema.Sitio + "/" + parteLista; ;

            foreach (SPListItem spItem in spLista.Items)
            {
                idIssue = null;
                titulo = null;

                urlItem = null;
                responsable = null;

                wp = null;
                descripcion = null;
                idIncidente = null;

                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)] != null && spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)] != null)
                {
                    idIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString();
                    idIssue = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString();
                    if (idIncidente == idIssue)
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                        {
                            titulo = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                        }
                        urlItem = url + "?ID=" + idIncidente;

                        nomSistema = sistema.Nombre;


                        if ((spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]) != null)
                        {
                            responsable = (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]).ToString();
                            responsable = responsable.Substring(responsable.LastIndexOf("#") + 1);
                            responsable = ObtenerUsuario(myWeb, responsable).LoginName;
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                        {
                            wp = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)] != null)
                        {
                            descripcion = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)] != null)
                        {
                            fechaPropuesto = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)] != null)
                        {
                            fechaCierre = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)] != null)
                        {
                            estado = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)].ToString();
                        }
                        DataIncidenteReporte dataIncidente = new DataIncidenteReporte(idIncidente, titulo, urlItem, responsable, nomSistema, wp, descripcion, fechaPropuesto, fechaCierre, estado);
                        DateTime fechaEstimada = ConstantesMGI.FechaVacia;
                        fechaEstimada = MaxFechaLista(myWeb, Lista.Tareas, spItem.ID.ToString(), "IDOriginal", "Fecha Estimada Fin");
                        int esfuerzo = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Restante");
                        int esfuerzoTotal = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Total");
                        dataIncidente.EsfuerzoRestante = esfuerzo.ToString();
                        dataIncidente.EsfuerzoTotal = esfuerzoTotal.ToString();
                        dataIncidente.FechaEstimadaFin = fechaEstimada;

                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }


        /// <summary>
        /// Retorna información de todos los incidentes en el sitio 
        /// del cliente-sistema
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="sistema"></param>
        /// <returns>List<DataIncidente></returns>
        public List<DataIncidenteReporte> GetIncidentesReporteFiltroUsrEstado(DataSistema sistema, string usuario, string valorCampo, DateTime perFchIni, DateTime perFchFin)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //         SPAcceso.Conectar(sistema.Sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sistema.Sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidenteReporte> listaDataIncidente = new List<DataIncidenteReporte>();
            string idIssue = null;
            string titulo = null;
            string url = null;
            string urlItem = null;
            string responsable = null;
            string nomSistema = null;
            string estado = null;
            string wp = null;
            string descripcion = null;
            string idIncidente = null;
            DateTime fechaPropuesto = ConstantesMGI.FechaVacia;
            DateTime fechaCierre = ConstantesMGI.FechaVacia;


            //uint idioma = myWeb.Language;
            //obtiene la parte final de la url conteniendo el nombre de la lista
            int ini = spLista.DefaultViewUrl.LastIndexOf(ConstantesMGI.PageDefaultUrlLista + "/");
            //elimina la vista por defecto porque no permite acceso directo a la url del item
            //en su lugar usamos DispForm.aspx
            int largo = spLista.DefaultViewUrl.LastIndexOf("/") - ini;
            string parteLista = spLista.DefaultViewUrl.Substring(ini, largo) + "/" + ConstantesMGI.PageDefaultUrlListaItems;
            url = sistema.Sitio + "/" + parteLista; ;

            string asignadoNom = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language).ToString()].InternalName.ToString();
            string estadoNom = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language).ToString()].InternalName.ToString();


            string fechap = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language).ToString()].InternalName.ToString();

            DateTime inicio = new DateTime(perFchIni.Date.Year, perFchIni.Date.Month, perFchIni.Date.Day, 0, 0, 0);
            DateTime fin = new DateTime(perFchFin.Date.Year, perFchFin.Date.Month, perFchFin.Date.Day, 23, 59, 59);
            string antesFin = "<Leq>" +
                                    "<FieldRef Name='" +
                                        fechap +
                                    "'/>" +
                                    "<Value Type='DateTime'>" +
                                        fin.ToString("s") +
                                    "</Value>" +
                                "</Leq>";

            string despuesIni = "<Geq>" +
                                    "<FieldRef Name='" +
                                        fechap +
                                    "'/>" +
                                    "<Value Type='DateTime'>" +
                                        inicio.ToString("s") +
                                    "</Value>" +
                                "</Geq>";



            string estadoTraducido = valorCampo; //spLista.Fields[SPAcceso.LeerCampoChoiceIdioma(Lista.Incidentes, "Estado",estado, myWeb.Language).ToString()].InternalName.ToString();
            string nomUsuario = myWeb.AllUsers[usuario].Name;
            string usuarioEsta = "<Eq>" +
                                    "<FieldRef Name='" +
                                        asignadoNom +
                                    "'/>" +
                                    "<Value Type='User'>" +
                                        nomUsuario +
                                    "</Value>" +
                                 "</Eq>";

            string estadoEsta = "<Eq>" +
                                    "<FieldRef Name='" +
                                        estadoNom +
                                    "'/>" +
                                    "<Value Type='Choice'>" +
                                        estadoTraducido +
                                    "</Value>" +
                                "</Eq>";

            SPQuery query = new SPQuery();
            if (valorCampo == null || valorCampo == "")
            {
                query.Query = "<Where>" +
                                "<And>" +
                                    usuarioEsta +
                                    "<And>" +
                                        antesFin +
                                        despuesIni +
                                    "</And>" +
                                "</And>" +
                              "</Where>";
            }
            else
            {
                query.Query = "<Where>" +
                                "<And>" +
                                    "<And>" +
                                        usuarioEsta +
                                        estadoEsta +
                                    "</And>" +
                                    "<And>" +
                                        antesFin +
                                        despuesIni +
                                    "</And>" +
                                "</And>" +
                              "</Where>";
            }


            foreach (SPListItem spItem in spLista.GetItems(query))
            {
                idIssue = null;
                titulo = null;

                urlItem = null;
                responsable = null;

                wp = null;
                descripcion = null;
                idIncidente = null;

                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)] != null && spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)] != null)
                {
                    idIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString();
                    idIssue = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString();
                    if (idIncidente == idIssue)
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                        {
                            titulo = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                        }
                        urlItem = url + "?ID=" + idIncidente;

                        nomSistema = sistema.Nombre;


                        if ((spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]) != null)
                        {
                            responsable = (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]).ToString();
                            responsable = responsable.Substring(responsable.LastIndexOf("#") + 1);
                            responsable = ObtenerUsuario(myWeb, responsable).LoginName;
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                        {
                            wp = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)] != null)
                        {
                            descripcion = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)] != null)
                        {
                            fechaPropuesto = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)] != null)
                        {
                            fechaCierre = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)] != null)
                        {
                            estado = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)].ToString();
                        }

                        DataIncidenteReporte dataIncidente = new DataIncidenteReporte(idIncidente, titulo, urlItem, responsable, nomSistema, wp, descripcion, fechaPropuesto, fechaCierre, estado);
                        DateTime fechaEstimada = ConstantesMGI.FechaVacia;
                        fechaEstimada = MaxFechaLista(myWeb, Lista.Tareas, spItem.ID.ToString(), "IDOriginal", "Fecha Estimada Fin");
                        int esfuerzo = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Restante");
                        int esfuerzoTotal = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Total");
                        dataIncidente.EsfuerzoRestante = esfuerzo.ToString();
                        dataIncidente.EsfuerzoTotal = esfuerzoTotal.ToString();
                        dataIncidente.FechaEstimadaFin = fechaEstimada;

                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }





        public List<DataIncidente> GetIncidentesWP(string sitio, int idWorkPackage)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidente> listaDataIncidente = new List<DataIncidente>();
            string tituloIncidente;

            string campoWP = SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language);

            string igualWP = "<Eq>" +
                                  "<FieldRef Name='" +
                                      campoWP +
                                  "'/>" +
                                  "<Value Type='Number'>" +
                                      idWorkPackage.ToString() +
                                  "</Value>" +
                              "</Eq>";


            SPQuery query = new SPQuery();
            query.Query = "<Where>" +
                             igualWP +
                          "</Where>";

            foreach (SPListItem spItem in spLista.GetItems(query))
            {
                int idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                int idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                if (idIncidente == idIssue)
                {

                    if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                    {
                        tituloIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                    }
                    else
                    {
                        tituloIncidente = "-no hay dato-";
                    }
                    DataIncidente dataIncidente = new DataIncidente(idIncidente, tituloIncidente);
                    listaDataIncidente.Add(dataIncidente);
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }






        /// <summary>
        /// Retorna las tareas en el sitio  
        /// que esten asociadas al incidente indicado
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="sistema"></param>
        /// <param name="incidente"></param>
        /// <returns>List<DataTarea></returns>
        public List<DataTarea> GetTareas(string sitio, int idIncidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            List<DataTarea> listaDataTarea = new List<DataTarea>();
            string strTemp = null;
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    strTemp = spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString();
                    if (strTemp == idIncidente.ToString())
                    {
                        DataTarea dataTarea = new DataTarea(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "ID", myWeb.Language)].ToString(), spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString());
                        listaDataTarea.Add(dataTarea);
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataTarea;
        }


        public DataTareaConCampos GetTarea(string sitio, int idTarea, List<DataCampo> campos)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            SPListItem item = spLista.GetItemById(idTarea);
            DataTareaConCampos dataTarea = new DataTareaConCampos(item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "ID", myWeb.Language)].ToString(), item[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Título", myWeb.Language)].ToString(), campos);

            foreach (DataCampo dataCampo in campos)
            {
                SPField spField = null;
                try
                {
                    spField = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Tareas, dataCampo.Titulo, myWeb.Language)];
                }
                catch
                {
                    throw new Exception("El nombre del campo " + SPAcceso.LeerCampoIdioma(Lista.Tareas, dataCampo.Titulo, myWeb.Language) + " del xml no existe en Sharepoint");
                }
                dataCampo.Tipo = SpTypeToCampoSharepoint(spField.TypeAsString);
                dataCampo.Titulo = spField.Title;
                dataCampo.Requerido = spField.Required;

                if (item[dataCampo.Titulo] != null)
                {
                    switch (dataCampo.Tipo)
                    {
                        case CampoSharepoint.Choice:
                            List<string> cadaChoice = new List<string>();
                            foreach (string choice in ((SPFieldChoice)spField).Choices)
                            {
                                cadaChoice.Add(choice);
                            }
                            dataCampo.Opciones = cadaChoice;
                            dataCampo.Valor = item[dataCampo.Titulo].ToString();
                            break;

                        case CampoSharepoint.DateTime:
                            dataCampo.Valor = ((DateTime)item[dataCampo.Titulo]).ToString(ConstantesMGI.FormatoFechas);
                            break;

                        case CampoSharepoint.User:
                            System.Text.RegularExpressions.Regex rexLookupField = new System.Text.RegularExpressions.Regex(@"(\d+);#(.*)$", System.Text.RegularExpressions.RegexOptions.Compiled);
                            if (rexLookupField.Match(item[dataCampo.Titulo].ToString()).Success)
                            {
                                string nomUsuarioSH = rexLookupField.Match(item[dataCampo.Titulo].ToString()).Result("$2");
                                dataCampo.Valor = ObtenerUsuario(myWeb, nomUsuarioSH).LoginName;
                            }
                            else
                            {
                                throw new Exception("Problemas al obtener usuario en Sharepoint");
                            }
                            break;
                        default:
                            dataCampo.Valor = item[dataCampo.Titulo].ToString();
                            break;
                    }
                }
                else
                    dataCampo.Valor = "";
            }






            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return dataTarea;


        }


        /// <summary>
        /// Dado un incidente de determinado sistema, una tarea y un usuario,
        /// se asigna la tarea al usuario y se asocia la misma al incidente.
        /// 
        /// </summary>
        /// <param name="sistema"></param>
        /// <param name="incidente"></param>
        /// <param name="tarea"></param>
        /// <param name="usuario"></param>
        /// <returns>
        ///         Retorna la dirección de email del usuario al que se le quiere asignar la tarea
        ///         o si no es válido el mismo, se retorna null
        /// </returns>
        public string AsignarResponsable(string sitioSistema, int idIncidente, int idTarea, DataUsuario usuario)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //          SPAcceso.Conectar(sitioSistema, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitioSistema, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            SPListItem spItem = spLista.Items.GetItemById(idTarea);
            string mail = null;
            if (SPUtility.IsLoginValid(mySite, usuario.Nombre))
            {
                SPUser spUser = myWeb.AllUsers[usuario.Nombre];
                spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language)] = spUser;
                spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] = idIncidente;
                spItem.Update();
                mail = spUser.Email;
            }

            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return mail;

        }

        public void SetIncidenteWP(string sitio, int idWorkPackage, int idIncidente)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);


            SPListItem spItem = spLista.Items.GetItemById(idIncidente);
            spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] = idWorkPackage;
            spItem.Update();

            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }





        /// <summary>
        /// Escribe en un archivo temporal la información enviada por el stream.
        /// Es usado para Recibir archivos que posteriormente serán adjuntados a
        /// incidentes en el sharepoint.
        /// </summary>
        /// <param name="sourceStream"></param>
        /// <returns></returns>
        public string UploadFile(Stream sourceStream)
        {
            FileStream targetStream = null;

            int nroTemp = 0;
            string filePath = "";
            string fileName = "";
            string uploadFolder = @".\";



            //generar un nombre de archivo temporal que no exista
            Random idGen = new Random();
            bool existe = true;
            while (existe)
            {
                nroTemp = idGen.Next(0, 999999999);

                fileName = "Upload" + nroTemp.ToString() + ".tmp";
                filePath = Path.Combine(uploadFolder, fileName);

                FileInfo archivo = new FileInfo(filePath);
                if (!archivo.Exists)
                {
                    existe = false;
                }
            }

            try
            {
                using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    const int bufferLen = 4096;
                    byte[] buffer = new byte[bufferLen];
                    int count = 0;
                    while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
                    {
                        targetStream.Write(buffer, 0, count);
                    }
                    targetStream.Close();
                    sourceStream.Close();
                }
                return nroTemp.ToString();
            }
            catch (Exception e)
            {
                throw new Exception("No se pudo crear el archivo temporal " + e.Message);
            }
        }





        /// <summary>
        /// Dada la existencia de un archivo temporal previamente cargado,  
        /// se envía a un sitio sharepoint y se adjunta a un incidente indicado 
        /// con el nombre indicado.
        /// </summary>
        /// <param name="nombreArchivo"></param>
        /// <param name="sistema"></param>
        /// <param name="incidente"></param>
        /// <param name="nroTemp"></param>
        /// <returns>indica si se pudo adjuntar</returns>
        public bool AdjuntarArchivoIncidente(string nombreArchivo, String urlSistema, int idIncidente, string nroTemp)
        {
            try
            {
                string uploadFolder = @".\";
                string filename = "Upload" + nroTemp + ".tmp";
                string filePath = Path.Combine(uploadFolder, filename);
                FileInfo archivo = new FileInfo(filePath);

                if (archivo.Exists)
                {
                    byte[] contenido = File.ReadAllBytes(filePath);

                    SPSite mySite = null;
                    SPWeb myWeb = null;
                    SPList spLista = null;
                    //            SPAcceso.Conectar(urlSistema, ref mySite, ref myWeb);
                    SPAcceso.ConectarLista(urlSistema, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

                    SPListItem spItem = spLista.Items.GetItemById(idIncidente);
                    spItem.Attachments.AddNow(nombreArchivo, contenido);
                    SPAcceso.Desconectar(ref mySite, ref myWeb);

                    File.Delete(filePath);
                    return true;
                }
                else
                {
                    //return false;
                    throw new Exception("No hay contenido cargado en el servidor");

                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }


        public DataAltaTarea AddTarea(string urlSistema, List<DataCampo> campos)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //   SPAcceso.Conectar(urlSistema, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(urlSistema, Lista.Tareas, ref mySite, ref myWeb, ref spLista);
            ControlarFechasTareas(myWeb, campos);
            string[] datosRetorno = SPAcceso.Impactar(myWeb, spLista, campos, Lista.Tareas);
            string mail = "";
            //si asignaron la tarea obtengo el mail del usuario
            foreach (DataCampo campo in campos)
            {
                if (campo.Titulo == SPAcceso.LeerCampoIdioma(Lista.Tareas, "Asignado a", myWeb.Language))
                {
                    string usuario = campo.Valor;
                    if (usuario != null)
                    {
                        if (SPUtility.IsLoginValid(mySite, usuario))
                        {
                            SPUser spUser = myWeb.AllUsers[usuario];
                            mail = spUser.Email;
                        }
                    }
                    break;
                }

            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return new DataAltaTarea(datosRetorno[0], datosRetorno[1], mail);
        }

        public int GetEsfuerzoTotalWP(string sitio, int idWP)
        {
            int esfuezo = 0;

            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            // SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

            List<int> idsIncidentes = new List<int>();

            //Recorro toda la lsita de incidentes para ver cual esta asociadp al WP
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                {
                    if (int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString()) == idWP)
                    {
                        int idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                        int idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                        if (idIncidente == idIssue)
                        {
                            idsIncidentes.Add(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString()));
                        }
                    }
                }
            }

            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            //Recorro toda la lista de Tareas para sumar los esfurzos de las tareas asociadas a los incidentes
            //de idsIncidentes.
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    if (idsIncidentes.Contains(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString())))
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Esfuerzo Total", myWeb.Language)] != null)
                        {
                            esfuezo += int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Esfuerzo Total", myWeb.Language)].ToString());
                        }
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return esfuezo;
        }

        public int GetEsfuerzoRestanteWP(string sitio, int idWP)
        {
            int esfuezo = 0;

            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

            List<int> idsIncidentes = new List<int>();

            //Recorro toda la lita de incidentes para ver cual esta asociadp al WP
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                {
                    if (int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString()) == idWP)
                    {
                        int idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                        int idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                        if (idIncidente == idIssue)
                        {
                            idsIncidentes.Add(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString()));
                        }
                    }
                }
            }

            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            //Recorro toda la lista de Tareas para sumar los esfurzos de las tareas asociadas a los incidentes
            //de idsIncidentes.
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    if (idsIncidentes.Contains(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString())))
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Esfuerzo Restante", myWeb.Language)] != null)
                        {
                            esfuezo += int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Esfuerzo Restante", myWeb.Language)].ToString());
                        }
                    }
                }
            }


            SPAcceso.Desconectar(ref mySite, ref myWeb);


            return esfuezo;
        }

        public bool ChkWpIncidentesOTareasSinCerrar(string sitio, int wkpCod)
        {

            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

            List<int> idsIncidentes = new List<int>();

            //Recorro todos los incidentes para ver si hay alguno sin cerrar
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                {
                    if (int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString()) == wkpCod)
                    {
                        int idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                        int idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                        if (idIncidente == idIssue)
                        {
                            if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)].ToString() != SPAcceso.LeerCampoChoiceIdioma(Lista.Incidentes, "Estado", "Cerrado", myWeb.Language))
                            {
                                return true;
                            }
                            else
                            {
                                idsIncidentes.Add(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString()));
                            }
                        }
                    }
                }
            }

            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            //Recorro toda la lista de Tareas  y si pertenecen a de idsIncidentes
            //me fijo si estan cerrados
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    if (idsIncidentes.Contains(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString())))
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Estado", myWeb.Language)].ToString() != SPAcceso.LeerCampoChoiceIdioma(Lista.Tareas, "Estado", "Cerrado", myWeb.Language))
                        {
                            return true;
                        }
                    }
                }
            }


            SPAcceso.Desconectar(ref mySite, ref myWeb);


            return false;
        }

        public void CerrarAsociadosWP(string sitio, int wpId)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //          SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);

            List<int> idsIncidentes = new List<int>();

            //Recorro toda la lsita de incidentes para ver cual esta asociadp al WP
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                {
                    if (int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString()) == wpId)
                    {
                        int idIncidente = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString());
                        int idIssue = int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString());
                        if (idIncidente == idIssue)
                        {
                            spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)] = SPAcceso.LeerCampoChoiceIdioma(Lista.Incidentes, "Estado", "Cerrado", myWeb.Language);
                            idsIncidentes.Add(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString()));
                            spItem.Update();
                        }
                    }
                }
            }

            SPAcceso.ConectarLista(sitio, Lista.Tareas, ref mySite, ref myWeb, ref spLista);

            //Recorro toda la lista de Tareas para sumar los esfurzos de las tareas asociadas a los incidentes
            //de idsIncidentes.
            foreach (SPListItem spItem in spLista.Items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)] != null)
                {
                    if (idsIncidentes.Contains(int.Parse(spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "IDOriginal", myWeb.Language)].ToString())))
                    {
                        spItem[SPAcceso.LeerCampoIdioma(Lista.Tareas, "Estado", myWeb.Language)] = SPAcceso.LeerCampoChoiceIdioma(Lista.Tareas, "Estado", "Cerrado", myWeb.Language);
                        spItem.Update();
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }



        /// <summary>
        /// Retorna información de todos los incidentes en el sitio 
        /// del cliente-sistema creados en el período
        /// </summary>
        /// <param name="cliente"></param>
        /// <param name="sistema"></param>
        /// <returns>List<DataIncidente></returns>
        public List<DataIncidenteReporte> GetIncidentesCreadosPeriodo(DataSistema sistema, DateTime perFchIni, DateTime perFchFin)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPList spLista = null;
            //          SPAcceso.Conectar(sistema.Sitio, ref mySite, ref myWeb);
            SPAcceso.ConectarLista(sistema.Sitio, Lista.Incidentes, ref mySite, ref myWeb, ref spLista);
            List<DataIncidenteReporte> listaDataIncidente = new List<DataIncidenteReporte>();
            string idIssue = null;
            string titulo = null;
            string url = null;
            string urlItem = null;
            string responsable = null;
            string nomSistema = null;
            string estado = null;
            string wp = null;
            string descripcion = null;
            string idIncidente = null;
            DateTime fechaPropuesto = ConstantesMGI.FechaVacia;
            DateTime fechaCierre = ConstantesMGI.FechaVacia;
            DateTime fechaEstimada = ConstantesMGI.FechaVacia;

            //uint idioma = myWeb.Language;
            //obtiene la parte final de la url conteniendo el nombre de la lista
            int ini = spLista.DefaultViewUrl.LastIndexOf(ConstantesMGI.PageDefaultUrlLista + "/");
            //elimina la vista por defecto porque no permite acceso directo a la url del item
            //en su lugar usamos DispForm.aspx
            int largo = spLista.DefaultViewUrl.LastIndexOf("/") - ini;
            string parteLista = spLista.DefaultViewUrl.Substring(ini, largo) + "/" + ConstantesMGI.PageDefaultUrlListaItems;
            url = sistema.Sitio + "/" + parteLista;
            string fechap = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language).ToString()].InternalName.ToString();

            DateTime inicio = new DateTime(perFchIni.Date.Year, perFchIni.Date.Month, perFchIni.Date.Day, 0, 0, 0);
            DateTime fin = new DateTime(perFchFin.Date.Year, perFchFin.Date.Month, perFchFin.Date.Day, 23, 59, 59);
            string antesFin = "<Leq>" +
                                    "<FieldRef Name='" +
                                        fechap +
                                    "'/>" +
                                    "<Value Type='DateTime'>" +
                                        fin.ToString("s") +
                                    "</Value>" +
                                "</Leq>";

            string despuesIni = "<Geq>" +
                                    "<FieldRef Name='" +
                                        fechap +
                                    "'/>" +
                                    "<Value Type='DateTime'>" +
                                        inicio.ToString("s") +
                                    "</Value>" +
                                "</Geq>";


            SPQuery query = new SPQuery();
            query.Query = "<Where>" +
                            "<And>" +
                                antesFin +
                                despuesIni +
                            "</And>" +
                          "</Where>";

            foreach (SPListItem spItem in spLista.GetItems(query))
            {
                idIssue = null;
                titulo = null;

                urlItem = null;
                responsable = null;

                wp = null;
                descripcion = null;
                idIncidente = null;
                fechaEstimada = ConstantesMGI.FechaVacia;
                fechaPropuesto = ConstantesMGI.FechaVacia;
                fechaCierre = ConstantesMGI.FechaVacia;



                if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)] != null && spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)] != null)
                {
                    idIncidente = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "ID", myWeb.Language)].ToString();
                    idIssue = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "IssueID", myWeb.Language)].ToString();
                    if (idIncidente == idIssue)
                    {
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)] != null)
                        {
                            titulo = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Título", myWeb.Language)].ToString();
                        }
                        urlItem = url + "?ID=" + idIncidente;

                        nomSistema = sistema.Nombre;


                        if ((spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]) != null)
                        {
                            responsable = (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Asignado a", myWeb.Language)]).ToString();
                            responsable = responsable.Substring(responsable.LastIndexOf("#") + 1);
                            responsable = ObtenerUsuario(myWeb, responsable).LoginName;
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)] != null)
                        {
                            wp = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "WP", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)] != null)
                        {
                            descripcion = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Descripción", myWeb.Language)].ToString();
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)] != null)
                        {
                            fechaPropuesto = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Propuesto", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)] != null)
                        {
                            fechaCierre = (DateTime)spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Fecha Cierre", myWeb.Language)];
                        }
                        if (spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)] != null)
                        {
                            estado = spItem[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)].ToString();
                        }

                        DataIncidenteReporte dataIncidente = new DataIncidenteReporte(idIncidente, titulo, urlItem, responsable, nomSistema, wp, descripcion, fechaPropuesto, fechaCierre, estado);
                        fechaEstimada = MaxFechaLista(myWeb, Lista.Tareas, spItem.ID.ToString(), "IDOriginal", "Fecha Estimada Fin");
                        int esfuerzo = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Restante");
                        int esfuerzoTotal = SumLista(myWeb, Lista.Tareas, idIncidente, "IDOriginal", "Esfuerzo Total");
                        dataIncidente.EsfuerzoRestante = esfuerzo.ToString();
                        dataIncidente.EsfuerzoTotal = esfuerzoTotal.ToString();
                        dataIncidente.FechaEstimadaFin = fechaEstimada;

                        listaDataIncidente.Add(dataIncidente);
                    }
                }
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return listaDataIncidente;
        }


        public bool IsFechaEstimadaEntregaWPMayorIncidentes(string sitio, int idWP, DateTime fechaEstEntWP)
        {
            List<DataIncidente> incidentesWP = GetIncidentesWP(sitio, idWP);
            foreach (DataIncidente incidente in incidentesWP)
            {

                DateTime fechaEstFinIncidente = DarFechaEstimadaFinIncidente(incidente.IdIncidente, sitio);
                if (fechaEstFinIncidente.CompareTo(fechaEstEntWP) > 0) return false;
            }
            return true;


        }


        public void ChkSitioSistema(string sitio)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPList spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(Lista.Incidentes, myWeb.Language)];
            SPAcceso.Desconectar(ref mySite, ref myWeb);
        }

        public List<string> GetEstadosIncidentes(string sitio)
        {
            SPSite mySite = null;
            SPWeb myWeb = null;
            SPAcceso.Conectar(sitio, ref mySite, ref myWeb);
            SPList spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(Lista.Incidentes, myWeb.Language)];

            SPField spField = spLista.Fields[SPAcceso.LeerCampoIdioma(Lista.Incidentes, "Estado", myWeb.Language)];

            List<string> estados = new List<string>();
            foreach (string estado in ((SPFieldChoice)spField).Choices)
            {
                estados.Add(estado);
            }
            SPAcceso.Desconectar(ref mySite, ref myWeb);
            return estados;

        }



        #endregion



        /// <summary>
        /// pre: el tipo de campo id y el que se quiere sumar deben ser del tipo number
        /// </summary>
        /// <param name="myweb"></param>
        /// <param name="tipoLista"></param>
        /// <param name="id"></param>
        /// <param name="campoId"></param>
        /// <param name="campoSumar"></param>
        /// <returns></returns>
        public int SumLista(SPWeb myWeb, Lista tipoLista, string id, string campoId, string campoSumar)
        {
            int esfuerzo = 0;
            SPQuery query = new SPQuery();
            query.Query = "<Where>" +
                                "<Eq>" +
                                    "<FieldRef Name='" +
                                        SPAcceso.LeerCampoIdioma(tipoLista, campoId, myWeb.Language) +
                                    "'/>" +
                                    "<Value Type='Number'>" +
                                        id +
                                    "</Value>" +
                                "</Eq>" +
                          "</Where>";

            SPList spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(tipoLista, myWeb.Language)];
            SPListItemCollection items = spLista.GetItems(query);
            foreach (SPListItem spItem in items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(tipoLista, campoSumar, myWeb.Language)] != null)
                {
                    esfuerzo += int.Parse(spItem[SPAcceso.LeerCampoIdioma(tipoLista, campoSumar, myWeb.Language)].ToString());
                }
            }
            return esfuerzo;
        }



        /// <summary>
        /// pre: el tipo de campo id es de tipo number y el que se quiere obtener el maximo debe ser del tipo fecha
        /// </summary>
        /// <param name="myweb"></param>
        /// <param name="tipoLista"></param>
        /// <param name="id"></param>
        /// <param name="campoId"></param>
        /// <param name="campoSumar"></param>
        /// <returns></returns>
        public DateTime MaxFechaLista(SPWeb myWeb, Lista tipoLista, string id, string campoId, string campoFecha)
        {
            SPQuery query = new SPQuery();
            query.Query = "<Where>" +
                                "<Eq>" +
                                    "<FieldRef Name='" +
                                        SPAcceso.LeerCampoIdioma(tipoLista, campoId, myWeb.Language) +
                                    "'/>" +
                                    "<Value Type='Number'>" +
                                        id +
                                    "</Value>" +
                                "</Eq>" +
                          "</Where>";

            DateTime fechaMax = ConstantesMGI.FechaVacia;
            DateTime fechaTemp = ConstantesMGI.FechaVacia;
            SPList spLista = myWeb.Lists[SPAcceso.LeerListaIdioma(tipoLista, myWeb.Language)];
            SPListItemCollection items = spLista.GetItems(query);
            foreach (SPListItem spItem in items)
            {
                if (spItem[SPAcceso.LeerCampoIdioma(tipoLista, campoFecha, myWeb.Language)] != null)
                {
                    fechaTemp = (DateTime)spItem[SPAcceso.LeerCampoIdioma(tipoLista, campoFecha, myWeb.Language)];
                    if (fechaTemp.Date.CompareTo(fechaMax.Date) > 0)
                    {
                        fechaMax = fechaTemp;
                    }
                }
            }
            return fechaMax;
        }









        /// <summary>
        /// Mapea los tipos de campos de sharepoint a los de MGI
        /// </summary>
        /// <param name="spType">String representando el tipo de datos de sharepoint</param>
        /// <returns></returns>
        public static CampoSharepoint SpTypeToCampoSharepoint(string spType)
        {
            switch (spType)
            {
                case "Choice":
                    return CampoSharepoint.Choice;
                case "DateTime":
                    return CampoSharepoint.DateTime;
                case "Number":
                    return CampoSharepoint.Number;
                case "Text":
                    return CampoSharepoint.Text;
                case "Boolean":
                    return CampoSharepoint.Boolean;
                case "Note":
                    return CampoSharepoint.Note;
                case "User":
                    return CampoSharepoint.User;
                default:
                    throw new NotImplementedException();
            }
        }


    }
}
